import java.io.EOFException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedList;

import neurones.Reseau;

import morpion.Coup;

import dauphine.util.Console;


public class ComputerVsComputer {
	public static void main(String[] args){
		Console.start();
		Runtime info=Runtime.getRuntime();
		long baseMemory;
		info.gc();
		int nbparties=0;
		baseMemory=info.freeMemory();
		boolean termine=false;
		Board board=new Board();
		int[] layer={3, 10, 10, 64};
		Reseau r=new Reseau(layer);
		r.randomize();
		ComputerPlayer cp=new ComputerPlayer(Board.BLACK,board,6, args[0], r);
		ComputerPlayer cp2=new ComputerPlayer(Board.WHITE,board,6, args[0], r);
		info.gc();
		double usedMemory=(double)(info.freeMemory()-baseMemory)/(1<<20);
		System.out.println("Memoire requise en Mo : " + usedMemory);
		boolean turn=false;
		int pieces=0;
		LinkedList<Coup> CoupsBlanc = new LinkedList<Coup>(); 
		LinkedList<Coup> CoupsNoir = new LinkedList<Coup>();
		System.out.println(board);
		while(!termine){
			while(!board.gameOver()){
				//Console.readString();
	
				if(turn){
					int pos=cp2.jouerCoup();
					int move=board.legal(Board.WHITE,pos);
					if(move!=-1){
						board.doMove(Board.WHITE,move);
						String position = Board.decodePosition(pos);
						int coup=cp2.EncodeInt64(position);
						CoupsBlanc.addFirst(new Coup(r.dump(), coup, r.getOutput()[coup]));
					}
				}
	
				else{
					int pos=cp.jouerCoup();
					int move=board.legal(Board.BLACK,pos);
					if(move!=-1){
						board.doMove(Board.BLACK,move);
						String position = Board.decodePosition(pos);
						int coup=cp.EncodeInt64(position);
						System.out.println("coup noir " + coup);
						CoupsNoir.addFirst(new Coup(r.dump(), coup, r.getOutput()[coup]));
					}
	
				}
				pieces++;
				turn = !turn;
				System.out.println(board);
			}
			//Une partie vient de se finir, on retropropage et on sauvegarde
			System.out.println("Partie terminee, retropropagation...");
			nbparties++;
			board=new Board();
			turn=false;
			
			ComputerPlayer.board=board;
			
			//Inserer ici le code de la retropropagation
			//Ugo a toi de jouer...
			
			CoupsBlanc.clear(); //On vide la liste des coups des deux joueurs
			CoupsNoir.clear();
			
			if(nbparties==100){
				System.out.println("Enregistrement de l'apprentissage...");
				System.out.println("Entrez le nom du fichier dans lequel enregistrer l'apprentissage :");
				String file=Console.readString();
				if(file.length()<=3){}
				else{
					File f=new File(file);
					try {
						FileWriter fw=new FileWriter(f);
						fw.write(r.toString());
						fw.flush();
						fw.close();
					} catch (IOException e1) {
						System.out.println("Erreur lors de la creation du fichier...");
						e1.printStackTrace();
					}
					System.out.println("Enregistrement Termine...");
				}
				nbparties=0;
			}
			
			try{
				ComputerPlayer.parseur.goNextGame();
			}
			catch(EOFException e){
				System.out.println("Fichier de parties termine apres "+nbparties+" parties. Entrez un nom de fichier de parties a ouvrir ou \"quit\" pour quitter: \n ");
				String file=Console.readString();
				if(file.equalsIgnoreCase("quit")==true){
					
					System.exit(0);
				}
				else{
					termine=false;
					try {
						ComputerPlayer.parseur=new WtdParser(file);
					} catch (FileNotFoundException e1) {
						e1.printStackTrace();
					}
				}
			} //Fin du catch
		
		}
		
	}
}
